/**
 * 
 */
package de.htw_saarland.webservices.xml;

import java.io.File;
import java.io.FileWriter;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.jdom.Content;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

import de.htw_saarland.webservices.robotersteuerung.data.RobotData;

/**
 * @author Sascha Klasse dient zum Auslesen und Verwalten von Buchungsdaten der
 *         Roboter
 * 
 *         <booking> <datetime></datetime> <expiratiodate></expiratiodate>
 *         <user></user> <roboid></roboid> </booking>
 * 
 */
public class BookingListHandler {

	public static String DATETIME = "datetime";
	public static String EXPIDATE = "expiratiodate";
	public static String USER = "user";
	public static String ROBOID = "roboid";
	public static String BOOKING = "booking";
	// Zeit bis die Buchung verwirkt!
	public static int EXPTIME = 60*60*1000;

	// Variable nötig um den korrekten Pfad zur xml Datei zu konstruieren
	private static String FILENAME = "/RoboSteuerung/WEB-INF/conf/bookinglist.xml";

	// XML Kram
	private SAXBuilder saxb = new SAXBuilder();
	private Document doc;

	private String pathToXml = null;

	/**
	 * Konstruktor
	 */
	public BookingListHandler() {
		try {
			// Versuch die Umgebungsvarialbe auszulesen!
			this.pathToXml = System.getenv("TOMCAT_APP_PATH");

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
		}
		
	}

	/**
	 * Methode dient zum Eintragen einer Buchung in die XML Datei
	 * 
	 * @param roboID
	 *            Die RoboterID
	 * @param UserID
	 *            Die BenutzerID
	 * @return true wenns funktioniert hat, false wenn etwas schief lief
	 */
	public boolean bookRobo(String roboID, String UserID) {
		this.deleteExpiredRobotBookings(); 
		if (this.isRobotFree(roboID)) {
			if (pathToXml != null) {
				Element root;
				try { 
					doc = saxb.build(new File(pathToXml
							+ BookingListHandler.FILENAME));
					root = doc.getRootElement();
					long date = System.currentTimeMillis();
					long expDate = System.currentTimeMillis()
							+ BookingListHandler.EXPTIME;

					// booking element erstellen
					Element booking = new Element(BookingListHandler.BOOKING);
					// Kinderknoten erstellen
					Element dateelem = new Element(BookingListHandler.DATETIME);
					dateelem.setText(String.valueOf(date));
					booking.addContent(dateelem);

					Element expdateelem = new Element(
							BookingListHandler.EXPIDATE);
					expdateelem.setText(String.valueOf(expDate));
					booking.addContent(expdateelem);

					Element userelem = new Element(BookingListHandler.USER);
					userelem.setText(UserID);
					booking.addContent(userelem);

					Element roboidelem = new Element(BookingListHandler.ROBOID);
					roboidelem.setText(roboID);
					booking.addContent(roboidelem);

					root.addContent(booking);

					// In Datei schreiben !!!
					XMLOutputter xmlout = new XMLOutputter();
					FileWriter filewriter = new FileWriter(pathToXml
							+ BookingListHandler.FILENAME, false);
					xmlout.output(root, filewriter);
					filewriter.flush();
				} catch (Exception ex) {
					System.out.println(ex.getMessage());
					return false;
				}
			} else {
				return false;
			}
		} else {
			return false;
		}

		return true;
	}

	/**
	 * Methode dient zum finden eines bestimmten Buchungssatzes in der xml Datei
	 * 
	 * @param roboID
	 * @return true, wenn gefunden und frei oder nicht gefunden, false wenn
	 *         gefunden
	 */
	public boolean isRobotFree(String roboID) {
		Element root;
		List<Element> list;
		Iterator<Element> ite;
		boolean returnValue = true;

		// ist die Umgebungsvariable != null fahre fort,
		if (pathToXml != null) {
			try {
				doc = saxb.build(new File(pathToXml
						+ BookingListHandler.FILENAME));
				root = doc.getRootElement();
				// Abfragen ob Root überhaupt Knoten besitzt
				if (root.getContentSize() > 0) {
					list = root.getChildren();
					ite = list.iterator();
					while (ite.hasNext()) {
						// Aufbau der einzelnen Roboter Objekte
						Element tmp;
						tmp = ite.next();
						

						if (tmp.getChildText(BookingListHandler.ROBOID).trim().equals(
								roboID.trim())) {
							long expDate = Long.parseLong(tmp
									.getChildText(BookingListHandler.EXPIDATE).trim());
							long now = System.currentTimeMillis();
							if ((expDate - now) <= 0) {

								return true;
							} else {

								return false;
							}
						}

					}
				}
			} catch (Exception ex) {
				System.out.println(ex.getMessage());
				return false; 
			}
		}

		return returnValue;
	}

	/**
	 * Methode dient zum löschen aller ausgelaufenen Buchungen!
	 */
	public void deleteExpiredRobotBookings() {
		Element root;
		List<Element> list;
		Iterator<Element> ite;
		boolean returnValue = true;

		// ist die Umgebungsvariable != null fahre fort,
		if (pathToXml != null) {
			try {
				
				doc = saxb.build(new File(pathToXml
						+ BookingListHandler.FILENAME));
				root = doc.getRootElement();
				// Abfragen ob Root überhaupt Knoten besitzt
				if (root.getContentSize() > 0) {
					list = root.getChildren();
					ite = list.iterator();
					while (ite.hasNext()) {
						
						Element tmp;
						tmp = ite.next();
						
						long expDate = Long.parseLong(tmp.getChildText(
								BookingListHandler.EXPIDATE));

						long now = System.currentTimeMillis();
						if (expDate < now) {
							ite.remove(); 
						} 

					}
					
					// In Datei schreiben !!!
					XMLOutputter xmlout = new XMLOutputter();
					FileWriter filewriter = new FileWriter(pathToXml
							+ BookingListHandler.FILENAME, false);
					xmlout.output(root, filewriter);
					filewriter.flush();

				}
			} catch (Exception ex) {
				// System.out.println("Exception da!!"); 
				System.out.println(ex.getMessage());

			}
		}

	}
	
	public boolean cancelRobot(String roboID, String userID) 
	{
		Element root;
		List<Element> list;
		Iterator<Element> ite;
		boolean returnValue = false;

		// ist die Umgebungsvariable != null fahre fort,
		if (pathToXml != null) {
			try {
				doc = saxb.build(new File(pathToXml
						+ BookingListHandler.FILENAME));
				root = doc.getRootElement();
				// Abfragen ob Root überhaupt Knoten besitzt
				if (root.getContentSize() > 0) {
					list = root.getChildren();
					ite = list.iterator();
					while (ite.hasNext()) {
						// Aufbau der einzelnen Roboter Objekte
						Element tmp;
						tmp = ite.next();
						

						if (tmp.getChildText(BookingListHandler.ROBOID).trim().equals(
								roboID.trim()) && 
								tmp.getChildText(BookingListHandler.USER).trim().equals(
								userID.trim())) {
							ite.remove(); 
							returnValue = true; 
						}

					}
					
				}
				
				// In Datei schreiben !!!
				XMLOutputter xmlout = new XMLOutputter();
				FileWriter filewriter = new FileWriter(pathToXml
						+ BookingListHandler.FILENAME, false);
				xmlout.output(root, filewriter);
				filewriter.flush();
			} catch (Exception ex) {
				System.out.println(ex.getMessage());
				return false; 
			}
		}		
		
		return returnValue ; 
	}


}
